home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 2002 November / SGI Freeware 2002 November - Disc 1.iso / dist / fw_emacs-lisp-intro.idb / usr / freeware / info / emacs-lisp-intro.info-13.z / emacs-lisp-intro.info-13
Text File  |  2002-07-08  |  50KB  |  1,258 lines

  1. This is emacs-lisp-intro.info, produced by makeinfo version 4.0b from
  2. emacs-lisp-intro.texi.
  3.  
  4. INFO-DIR-SECTION Emacs
  5. START-INFO-DIR-ENTRY
  6. * Emacs Lisp Intro: (eintr).
  7.               A simple introduction to Emacs Lisp programming.
  8. END-INFO-DIR-ENTRY
  9.  
  10.    This is an introduction to `Programming in Emacs Lisp', for people
  11. who are not programmers.
  12.  
  13.    Edition 2.04, 2001 Dec 17
  14.  
  15.    Copyright (C) 1990, '91, '92, '93, '94, '95, '97, 2001 Free Software
  16. Foundation, Inc.
  17.  
  18.    Permission is granted to copy, distribute and/or modify this document
  19. under the terms of the GNU Free Documentation License, Version 1.1 or
  20. any later version published by the Free Software Foundation; with the
  21. Invariant Section being the Preface, with the Front-Cover Texts being
  22. no Front-Cover Texts, and with the Back-Cover Texts being no Back-Cover
  23. Texts.  A copy of the license is included in the section entitled "GNU
  24. Free Documentation License".
  25.  
  26. 
  27. File: emacs-lisp-intro.info,  Node: Mode Line,  Prev: Miscellaneous,  Up: Emacs Initialization
  28.  
  29. A Modified Mode Line
  30. ====================
  31.  
  32.    Finally, a feature I really like: a modified mode line.
  33.  
  34.    When I work over a network, I forget which machine I am using.  Also,
  35. I tend to I lose track of where I am, and which line point is on.
  36.  
  37.    So I reset my mode line to look like this:
  38.  
  39.      -:-- foo.texi   rattlesnake:/home/bob/  Line 1  (Texinfo Fill) Top
  40.  
  41.    I am visiting a file called `foo.texi', on my machine `rattlesnake'
  42. in my `/home/bob' buffer.  I am on line 1, in Texinfo mode, and am at
  43. the top of the buffer.
  44.  
  45.    My `.emacs' file has a section that looks like this:
  46.  
  47.      ;; Set a Mode Line that tells me which machine, which directory,
  48.      ;; and which line I am on, plus the other customary information.
  49.      (setq default-mode-line-format
  50.       (quote
  51.        (#("-" 0 1
  52.           (help-echo
  53.            "mouse-1: select window, mouse-2: delete others ..."))
  54.         mode-line-mule-info
  55.         mode-line-modified
  56.         mode-line-frame-identification
  57.         "    "
  58.         mode-line-buffer-identification
  59.         "    "
  60.         (:eval (substring
  61.                 (system-name) 0 (string-match "\\..+" (system-name))))
  62.         ":"
  63.         default-directory
  64.         #(" " 0 1
  65.           (help-echo
  66.            "mouse-1: select window, mouse-2: delete others ..."))
  67.         (line-number-mode " Line %l ")
  68.         global-mode-string
  69.         #("   %[(" 0 6
  70.           (help-echo
  71.            "mouse-1: select window, mouse-2: delete others ..."))
  72.         (:eval (mode-line-mode-name))
  73.         mode-line-process
  74.         minor-mode-alist
  75.         #("%n" 0 2 (help-echo "mouse-2: widen" local-map (keymap ...)))
  76.         ")%] "
  77.         (-3 . "%P")
  78.         ;;   "-%-"
  79.         )))
  80.  
  81. Here, I redefine the default mode line.  Most of the parts are from the
  82. original; but I make a few changes.  I set the _default_ mode line
  83. format so as to permit various modes, such as Info, to override it.
  84.  
  85.    Many elements in the list are self-explanatory: `mode-line-modified'
  86. is a variable that tells whether the buffer has been modified,
  87. `mode-name' tells the name of the mode, and so on.  However, the format
  88. looks complicated because of two features we have not discussed.
  89.  
  90.    The first string in the mode line is a dash or hyphen, `-'.  In the
  91. old days, it would have been specified simply as `"-"'.  But nowadays,
  92. Emacs can add properties to a string, such as highlighting or, as in
  93. this case, a help feature.  If you place your mouse cursor over the
  94. hyphen, some help information appears  (By default, you must wait one
  95. second before the information appears.  You can change that timing by
  96. changing the value of `tooltip-delay'.)
  97.  
  98.    The new string format has a special syntax:
  99.  
  100.      #("-" 0 1 (help-echo "mouse-1: select window, ..."))
  101.  
  102. The `#(' begins a list.  The first element of the list is the string
  103. itself, just one `-'.  The second and third elements specify the range
  104. over which the fourth element applies.  A range starts _after_ a
  105. character, so a zero means the range starts just before the first
  106. character; a 1 means that the range ends just after the first
  107. character.  The third element is the property for the range.  It
  108. consists of a property list,  a property name, in this case,
  109. `help-echo', followed by a value, in this case, a string.  The second,
  110. third, and fourth elements of this new string format can be repeated.
  111.  
  112.    *Note Text Properties in String: (elisp)Text Props and Strings, and
  113. see *Note Mode Line Format: (elisp)Mode Line Format, for more
  114. information.
  115.  
  116.    `mode-line-buffer-identification' displays the current buffer name.
  117. It is a list beginning `(#("%12b" 0 4 ...'.  The `#(' begins the list.
  118.  
  119.    The `"%12b"' displays the current buffer name, using the
  120. `buffer-name' function with which we are familiar; the `12' specifies
  121. the maximum number of characters that will be displayed.  When a name
  122. has fewer characters, whitespace is added to fill out to this number.
  123. (Buffer names can and often should be longer than 12 characters; this
  124. length works well in a typical 80 column wide window.)
  125.  
  126.    `:eval' is a new feature in GNU Emacs version 21.  It says to
  127. evaluate the following form and use the result as a string to display.
  128. In this case, the expression displays the first component of the full
  129. system name.  The end of the first component is a `.' (`period'), so I
  130. use the `string-match' function to tell me the length of the first
  131. component.  The substring from the zeroth character to that length is
  132. the name of the machine.
  133.  
  134.    This is the expression:
  135.  
  136.      (:eval (substring
  137.              (system-name) 0 (string-match "\\..+" (system-name))))
  138.  
  139.    `%[' and `%]' cause a pair of square brackets to appear for each
  140. recursive editing level.  `%n' says `Narrow' when narrowing is in
  141. effect.  `%P' tells you the percentage of the buffer that is above the
  142. bottom of the window, or `Top', `Bottom', or `All'.  (A lower case `p'
  143. tell you the percentage above the _top_ of the window.)  `%-' inserts
  144. enough dashes to fill out the line.
  145.  
  146.    Remember, "You don't have to like Emacs to like it" -- your own
  147. Emacs can have different colors, different commands, and different keys
  148. than a default Emacs.
  149.  
  150.    On the other hand, if you want to bring up a plain `out of the box'
  151. Emacs, with no customization, type:
  152.  
  153.      emacs -q
  154.  
  155. This will start an Emacs that does _not_ load your `~/.emacs'
  156. initialization file.  A plain, default Emacs.  Nothing more.
  157.  
  158. 
  159. File: emacs-lisp-intro.info,  Node: Debugging,  Next: Conclusion,  Prev: Emacs Initialization,  Up: Top
  160.  
  161. Debugging
  162. *********
  163.  
  164.    GNU Emacs has two debuggers, `debug' and `edebug'.  The first is
  165. built into the internals of Emacs and is always with you; the second
  166. requires that you instrument a function before you can use it.
  167.  
  168.    Both debuggers are described extensively in *Note Debugging Lisp
  169. Programs: (elisp)Debugging.  In this chapter, I will walk through a
  170. short example of each.
  171.  
  172. * Menu:
  173.  
  174. * debug::                       How to use the built-in debugger.
  175. * debug-on-entry::              Start debugging when you call a function.
  176. * debug-on-quit::               Start debugging when you quit with C-g.
  177. * edebug::                      How to use Edebug, a source level debugger.
  178. * Debugging Exercises::
  179.  
  180. 
  181. File: emacs-lisp-intro.info,  Node: debug,  Next: debug-on-entry,  Prev: Debugging,  Up: Debugging
  182.  
  183. `debug'
  184. =======
  185.  
  186.    Suppose you have written a function definition that is intended to
  187. return the sum of the numbers 1 through a given number.  (This is the
  188. `triangle' function discussed earlier.  *Note Example with Decrementing
  189. Counter: Decrementing Example, for a discussion.)
  190.  
  191.    However, your function definition has a bug.  You have mistyped `1='
  192. for `1-'.  Here is the broken definition:
  193.  
  194.      (defun triangle-bugged (number)
  195.        "Return sum of numbers 1 through NUMBER inclusive."
  196.        (let ((total 0))
  197.          (while (> number 0)
  198.            (setq total (+ total number))
  199.            (setq number (1= number)))      ; Error here.
  200.          total))
  201.  
  202.    If you are reading this in Info, you can evaluate this definition in
  203. the normal fashion.  You will see `triangle-bugged' appear in the echo
  204. area.
  205.  
  206.    Now evaluate the `triangle-bugged' function with an argument of 4:
  207.  
  208.      (triangle-bugged 4)
  209.  
  210. In GNU Emacs version 21, you will create and enter a `*Backtrace*'
  211. buffer that says:
  212.  
  213.      ---------- Buffer: *Backtrace* ----------
  214.      Debugger entered--Lisp error: (void-function 1=)
  215.        (1= number)
  216.        (setq number (1= number))
  217.        (while (> number 0) (setq total (+ total number))
  218.              (setq number (1= number)))
  219.        (let ((total 0)) (while (> number 0) (setq total ...)
  220.          (setq number ...)) total)
  221.        triangle-bugged(4)
  222.        eval((triangle-bugged 4))
  223.        eval-last-sexp-1(nil)
  224.        eval-last-sexp(nil)
  225.        call-interactively(eval-last-sexp)
  226.      ---------- Buffer: *Backtrace* ----------
  227.  
  228. (I have reformatted this example slightly; the debugger does not fold
  229. long lines.  As usual, you can quit the debugger by typing `q' in the
  230. `*Backtrace*' buffer.)
  231.  
  232.    In practice, for a bug as simple as this, the `Lisp error' line will
  233. tell you what you need to know to correct the definition.  The function
  234. `1=' is `void'.
  235.  
  236.    In GNU Emacs 20 and before, you will see:
  237.  
  238.      Symbol's function definition is void: 1=
  239.  
  240. which has the same meaning as the `*Backtrace*' buffer line in version
  241. 21.
  242.  
  243.    However, suppose you are not quite certain what is going on?  You
  244. can read the complete backtrace.
  245.  
  246.    In this case, you need to run GNU Emacs 21, which automatically
  247. starts the debugger that puts you in the `*Backtrace*' buffer; or else,
  248. you need to start the debugger manually as described below.
  249.  
  250.    Read the `*Backtrace*' buffer from the bottom up; it tells you what
  251. Emacs did that led to the error.  Emacs made an interactive call to
  252. `C-x C-e' (`eval-last-sexp'), which led to the evaluation of the
  253. `triangle-bugged' expression.  Each line above tells you what the Lisp
  254. interpreter evaluated next.
  255.  
  256.    The third line from the top of the buffer is
  257.  
  258.      (setq number (1= number))
  259.  
  260. Emacs tried to evaluate this expression; in order to do so, it tried to
  261. evaluate the inner expression shown on the second line from the top:
  262.  
  263.      (1= number)
  264.  
  265. This is where the error occurred; as the top line says:
  266.  
  267.      Debugger entered--Lisp error: (void-function 1=)
  268.  
  269. You can correct the mistake, re-evaluate the function definition, and
  270. then run your test again.
  271.  
  272. 
  273. File: emacs-lisp-intro.info,  Node: debug-on-entry,  Next: debug-on-quit,  Prev: debug,  Up: Debugging
  274.  
  275. `debug-on-entry'
  276. ================
  277.  
  278.    GNU Emacs 21 starts the debugger automatically when your function has
  279. an error.  GNU Emacs version 20 and before did not; it simply presented
  280. you with an error message.  You had to start the debugger manually.
  281.  
  282.    You can start the debugger manually for all versions of Emacs; the
  283. advantage is that the debugger runs even if you do not have a bug in
  284. your code.  Sometimes your code will be free of bugs!
  285.  
  286.    You can enter the debugger when you call the function by calling
  287. `debug-on-entry'.
  288.  
  289. Type:
  290.  
  291.      M-x debug-on-entry RET triangle-bugged RET
  292.  
  293. Now, evaluate the following:
  294.  
  295.      (triangle-bugged 5)
  296.  
  297. All versions of Emacs will create a `*Backtrace*' buffer and tell you
  298. that it is beginning to evaluate the `triangle-bugged' function:
  299.  
  300.      ---------- Buffer: *Backtrace* ----------
  301.      Debugger entered--entering a function:
  302.      * triangle-bugged(5)
  303.        eval((triangle-bugged 5))
  304.        eval-last-sexp-1(nil)
  305.        eval-last-sexp(nil)
  306.        call-interactively(eval-last-sexp)
  307.      ---------- Buffer: *Backtrace* ----------
  308.  
  309.    In the `*Backtrace*' buffer, type `d'.  Emacs will evaluate the
  310. first expression in `triangle-bugged'; the buffer will look like this:
  311.  
  312.      ---------- Buffer: *Backtrace* ----------
  313.      Debugger entered--beginning evaluation of function call form:
  314.      * (let ((total 0)) (while (> number 0) (setq total ...)
  315.              (setq number ...)) total)
  316.      * triangle-bugged(5)
  317.        eval((triangle-bugged 5))
  318.        eval-last-sexp-1(nil)
  319.        eval-last-sexp(nil)
  320.        call-interactively(eval-last-sexp)
  321.      ---------- Buffer: *Backtrace* ----------
  322.  
  323. Now, type `d' again, eight times, slowly.  Each time you type `d',
  324. Emacs will evaluate another expression in the function definition.
  325.  
  326.    Eventually, the buffer will look like this:
  327.  
  328.      ---------- Buffer: *Backtrace* ----------
  329.      Debugger entered--beginning evaluation of function call form:
  330.      * (setq number (1= number))
  331.      * (while (> number 0) (setq total (+ total number))
  332.              (setq number (1= number)))
  333.      * (let ((total 0)) (while (> number 0) (setq total ...)
  334.              (setq number ...)) total)
  335.      * triangle-bugged(5)
  336.        eval((triangle-bugged 5))
  337.        eval-last-sexp-1(nil)
  338.        eval-last-sexp(nil)
  339.        call-interactively(eval-last-sexp)
  340.      ---------- Buffer: *Backtrace* ----------
  341.  
  342. Finally, after you type `d' two more times, Emacs will reach the error,
  343. and the top two lines of the `*Backtrace*' buffer will look like this:
  344.  
  345.      ---------- Buffer: *Backtrace* ----------
  346.      Debugger entered--Lisp error: (void-function 1=)
  347.      * (1= number)
  348.      ...
  349.      ---------- Buffer: *Backtrace* ----------
  350.  
  351.    By typing `d', you were able to step through the function.
  352.  
  353.    You can quit a `*Backtrace*' buffer by typing `q' in it; this quits
  354. the trace, but does not cancel `debug-on-entry'.
  355.  
  356.    To cancel the effect of `debug-on-entry', call
  357. `cancel-debug-on-entry' and the name of the function, like this:
  358.  
  359.      M-x cancel-debug-on-entry RET triangle-bugged RET
  360.  
  361. (If you are reading this in Info, cancel `debug-on-entry' now.)
  362.  
  363. 
  364. File: emacs-lisp-intro.info,  Node: debug-on-quit,  Next: edebug,  Prev: debug-on-entry,  Up: Debugging
  365.  
  366. `debug-on-quit' and `(debug)'
  367. =============================
  368.  
  369.    In addition to setting `debug-on-error' or calling `debug-on-entry',
  370. there are two other ways to start `debug'.
  371.  
  372.    You can start `debug' whenever you type `C-g' (`keyboard-quit') by
  373. setting the variable `debug-on-quit' to `t'.  This is useful for
  374. debugging infinite loops.
  375.  
  376.    Or, you can insert a line that says `(debug)' into your code where
  377. you want the debugger to start, like this:
  378.  
  379.      (defun triangle-bugged (number)
  380.        "Return sum of numbers 1 through NUMBER inclusive."
  381.        (let ((total 0))
  382.          (while (> number 0)
  383.            (setq total (+ total number))
  384.            (debug)                         ; Start debugger.
  385.            (setq number (1= number)))      ; Error here.
  386.          total))
  387.  
  388.    The `debug' function is described in detail in *Note The Lisp
  389. Debugger: (elisp)Debugger.
  390.  
  391. 
  392. File: emacs-lisp-intro.info,  Node: edebug,  Next: Debugging Exercises,  Prev: debug-on-quit,  Up: Debugging
  393.  
  394. The `edebug' Source Level Debugger
  395. ==================================
  396.  
  397.    Edebug is a source level debugger.  Edebug normally displays the
  398. source of the code you are debugging, with an arrow at the left that
  399. shows which line you are currently executing.
  400.  
  401.    You can walk through the execution of a function, line by line, or
  402. run quickly until reaching a "breakpoint" where execution stops.
  403.  
  404.    Edebug is described in *Note Edebug: (elisp)edebug.
  405.  
  406.    Here is a bugged function definition for `triangle-recursively'.
  407. *Note Recursion in place of a counter: Recursive triangle function, for
  408. a review of it.
  409.  
  410.      (defun triangle-recursively-bugged (number)
  411.        "Return sum of numbers 1 through NUMBER inclusive.
  412.      Uses recursion."
  413.        (if (= number 1)
  414.            1
  415.          (+ number
  416.             (triangle-recursively-bugged
  417.              (1= number)))))               ; Error here.
  418.  
  419. Normally, you would install this definition by positioning your cursor
  420. after the function's closing parenthesis and typing `C-x C-e'
  421. (`eval-last-sexp') or else by positioning your cursor within the
  422. definition and typing `C-M-x' (`eval-defun').  (By default, the
  423. `eval-defun' command works only in Emacs Lisp mode or in Lisp
  424. Interactive mode.)
  425.  
  426.    However, to prepare this function definition for Edebug, you must
  427. first "instrument" the code using a different command.  You can do this
  428. by positioning your cursor within the definition and typing
  429.  
  430.      M-x edebug-defun RET
  431.  
  432. This will cause Emacs to load Edebug automatically if it is not already
  433. loaded, and properly instrument the function.
  434.  
  435.    After instrumenting the function, place your cursor after the
  436. following expression and type `C-x C-e' (`eval-last-sexp'):
  437.  
  438.      (triangle-recursively-bugged 3)
  439.  
  440. You will be jumped back to the source for `triangle-recursively-bugged'
  441. and the cursor positioned at the beginning of the `if' line of the
  442. function.  Also, you will see an arrowhead at the left hand side of
  443. that line.  The arrowhead marks the line where the function is
  444. executing.  (In the following examples, we show the arrowhead with
  445. `=>'; in a windowing system, you may see the arrowhead as a solid
  446. triangle in the window `fringe'.)
  447.  
  448.      =>-!-(if (= number 1)
  449.  
  450. In the example, the location of point is displayed as `-!-' (in a
  451. printed book, it is displayed with a five pointed star).
  452.  
  453. If you now press <SPC>, point will move to the next expression to be
  454. executed; the line will look like this:
  455.  
  456.      =>(if -!-(= number 1)
  457.  
  458. As you continue to press <SPC>, point will move from expression to
  459. expression.  At the same time, whenever an expression returns a value,
  460. that value will be displayed in the echo area.  For example, after you
  461. move point past `number', you will see the following:
  462.  
  463.      Result: 3 = C-c
  464.  
  465. This means the value of `number' is 3, which is ASCII `control-c' (the
  466. third letter of the alphabet).
  467.  
  468.    You can continue moving through the code until you reach the line
  469. with the error.  Before evaluation, that line looks like this:
  470.  
  471.      =>        -!-(1= number)))))               ; Error here.
  472.  
  473. When you press <SPC> once again, you will produce an error message that
  474. says:
  475.  
  476.      Symbol's function definition is void: 1=
  477.  
  478. This is the bug.
  479.  
  480.    Press `q' to quit Edebug.
  481.  
  482.    To remove instrumentation from a function definition, simply
  483. re-evaluate it with a command that does not instrument it.  For
  484. example, you could place your cursor after the definition's closing
  485. parenthesis and type `C-x C-e'.
  486.  
  487.    Edebug does a great deal more than walk with you through a function.
  488. You can set it so it races through on its own, stopping only at an
  489. error or at specified stopping points; you can cause it to display the
  490. changing values of various expressions; you can find out how many times
  491. a function is called, and more.
  492.  
  493.    Edebug is described in *Note Edebug: (elisp)edebug.
  494.  
  495. 
  496. File: emacs-lisp-intro.info,  Node: Debugging Exercises,  Prev: edebug,  Up: Debugging
  497.  
  498. Debugging Exercises
  499. ===================
  500.  
  501.    * Install the `count-words-region' function and then cause it to
  502.      enter the built-in debugger when you call it.  Run the command on a
  503.      region containing two words.  You will need to press `d' a
  504.      remarkable number of times.  On your system, is a `hook' called
  505.      after the command finishes?  (For information on hooks, see *Note
  506.      Command Loop Overview: (elisp)Command Overview.)
  507.  
  508.    * Copy `count-words-region' into the `*scratch*' buffer, instrument
  509.      the function for Edebug, and walk through its execution.  The
  510.      function does not need to have a bug, although you can introduce
  511.      one if you wish.  If the function lacks a bug, the walk-through
  512.      completes without problems.
  513.  
  514.    * While running Edebug, type `?' to see a list of all the Edebug
  515.      commands.  (The `global-edebug-prefix' is usually `C-x X', i.e.
  516.      `<CTL>-x' followed by an upper case `X'; use this prefix for
  517.      commands made outside of the Edebug debugging buffer.)
  518.  
  519.    * In the Edebug debugging buffer, use the `p'
  520.      (`edebug-bounce-point') command to see where in the region the
  521.      `count-words-region' is working.
  522.  
  523.    * Move point to some spot further down function and then type the
  524.      `h' (`edebug-goto-here') command to jump to that location.
  525.  
  526.    * Use the `t' (`edebug-trace-mode') command to cause Edebug to walk
  527.      through the function on its own; use an upper case `T' for
  528.      `edebug-Trace-fast-mode'.
  529.  
  530.    * Set a breakpoint, then run Edebug in Trace mode until it reaches
  531.      the stopping point.
  532.  
  533. 
  534. File: emacs-lisp-intro.info,  Node: Conclusion,  Next: the-the,  Prev: Debugging,  Up: Top
  535.  
  536. Conclusion
  537. **********
  538.  
  539.    We have now reached the end of this Introduction.  You have now
  540. learned enough about programming in Emacs Lisp to set values, to write
  541. simple `.emacs' files for yourself and your friends, and write simple
  542. customizations and extensions to Emacs.
  543.  
  544.    This is a place to stop.  Or, if you wish, you can now go onward, and
  545. teach yourself.
  546.  
  547.    You have learned some of the basic nuts and bolts of programming.
  548. But only some.  There are a great many more brackets and hinges that are
  549. easy to use that we have not touched.
  550.  
  551.    A path you can follow right now lies among the sources to GNU Emacs
  552. and in *Note The GNU Emacs Lisp Reference Manual: (elisp)Top.
  553.  
  554.    The Emacs Lisp sources are an adventure.  When you read the sources
  555. and come across a function or expression that is unfamiliar, you need to
  556. figure out or find out what it does.
  557.  
  558.    Go to the Reference Manual.  It is a thorough, complete, and fairly
  559. easy-to-read description of Emacs Lisp.  It is written not only for
  560. experts, but for people who know what you know.  (The `Reference
  561. Manual' comes with the standard GNU Emacs distribution.  Like this
  562. introduction, it comes as a Texinfo source file, so you can read it
  563. on-line and as a typeset, printed book.)
  564.  
  565.    Go to the other on-line help that is part of GNU Emacs: the on-line
  566. documentation for all functions, and `find-tags', the program that
  567. takes you to sources.
  568.  
  569.    Here is an example of how I explore the sources.  Because of its
  570. name, `simple.el' is the file I looked at first, a long time ago.  As
  571. it happens some of the functions in `simple.el' are complicated, or at
  572. least look complicated at first sight.  The `open-line' function, for
  573. example, looks complicated.
  574.  
  575.    You may want to walk through this function slowly, as we did with the
  576. `forward-sentence' function.  (*Note forward-sentence::.)  Or you may
  577. want to skip that function and look at another, such as `split-line'.
  578. You don't need to read all the functions.  According to
  579. `count-words-in-defun', the `split-line' function contains 27 words and
  580. symbols.
  581.  
  582.    Even though it is short, `split-line' contains four expressions we
  583. have not studied: `skip-chars-forward', `indent-to', `current-column'
  584. and `?\n'.
  585.  
  586.    Consider the `skip-chars-forward' function.  (It is part of the
  587. function definition for `back-to-indentation', which is shown in *Note
  588. Review: Review.)
  589.  
  590.    In GNU Emacs, you can find out more about `skip-chars-forward' by
  591. typing `C-h f' (`describe-function') and the name of the function.
  592. This gives you the function documentation.
  593.  
  594.    You may be able to guess what is done by a well named function such
  595. as `indent-to'; or you can look it up, too.  Incidentally, the
  596. `describe-function' function itself is in `help.el'; it is one of those
  597. long, but decipherable functions.  You can look up `describe-function'
  598. using the `C-h f' command!
  599.  
  600.    In this instance, since the code is Lisp, the `*Help*' buffer
  601. contains the name of the library containing the function's source.  You
  602. can put point over the name of the library and press the RET key, which
  603. in this situation is bound to `help-follow', and be taken directly to
  604. the source, in the same way as `M-.' (`find-tag').
  605.  
  606.    The definition for `describe-function' illustrates how to customize
  607. the `interactive' expression without using the standard character
  608. codes; and it shows how to create a temporary buffer.
  609.  
  610.    (The `indent-to' function is written in C rather than Emacs Lisp; it
  611. is a `built-in' function.  `help-follow' only provides you with the
  612. documentation of a built-in function; it does not take you to the
  613. source.  But `find-tag' will take you to the source, if properly set
  614. up.)
  615.  
  616.    You can look at a function's source using `find-tag', which is bound
  617. to `M-.'  Finally, you can find out what the Reference Manual has to
  618. say by visiting the manual in Info, and typing `i' (`Info-index') and
  619. the name of the function, or by looking up `skip-chars-forward' in the
  620. index to a printed copy of the manual.
  621.  
  622.    Similarly, you can find out what is meant by `?\n'.  You can try
  623. using `Info-index' with `?\n'.  It turns out that this action won't
  624. help; but don't give up.  If you search the index for `\n' without the
  625. `?', you will be taken directly to the relevant section of the manual.
  626. (*Note Character Type: (elisp)Character Type.  `?\n' stands for the
  627. newline character.)
  628.  
  629.    Other interesting source files include `paragraphs.el',
  630. `loaddefs.el', and `loadup.el'.  The `paragraphs.el' file includes
  631. short, easily understood functions as well as longer ones.  The
  632. `loaddefs.el' file contains the many standard autoloads and many
  633. keymaps.  I have never looked at it all; only at parts.  `loadup.el' is
  634. the file that loads the standard parts of Emacs; it tells you a great
  635. deal about how Emacs is built.  (*Note Building Emacs: (elisp)Building
  636. Emacs, for more about building.)
  637.  
  638.    As I said, you have learned some nuts and bolts; however, and very
  639. importantly, we have hardly touched major aspects of programming; I
  640. have said nothing about how to sort information, except to use the
  641. predefined `sort' function; I have said nothing about how to store
  642. information, except to use variables and lists; I have said nothing
  643. about how to write programs that write programs.  These are topics for
  644. another, and different kind of book, a different kind of learning.
  645.  
  646.    What you have done is learn enough for much practical work with GNU
  647. Emacs.  What you have done is get started.  This is the end of a
  648. beginning.
  649.  
  650. 
  651. File: emacs-lisp-intro.info,  Node: the-the,  Next: Kill Ring,  Prev: Conclusion,  Up: Top
  652.  
  653. The `the-the' Function
  654. **********************
  655.  
  656.    Sometimes when you you write text, you duplicate words--as with "you
  657. you" near the beginning of this sentence.  I find that most frequently,
  658. I duplicate "the'; hence, I call the function for detecting duplicated
  659. words, `the-the'.
  660.  
  661.    As a first step, you could use the following regular expression to
  662. search for duplicates:
  663.  
  664.      \\(\\w+[ \t\n]+\\)\\1
  665.  
  666. This regexp matches one or more word-constituent characters followed by
  667. one or more spaces, tabs, or newlines.  However, it does not detect
  668. duplicated words on different lines, since the ending of the first
  669. word, the end of the line, is different from the ending of the second
  670. word, a space.  (For more information about regular expressions, see
  671. *Note Regular Expression Searches: Regexp Search, as well as *Note
  672. Syntax of Regular Expressions: (emacs)Regexps, and *Note Regular
  673. Expressions: (elisp)Regular Expressions.)
  674.  
  675.    You might try searching just for duplicated word-constituent
  676. characters but that does not work since the pattern detects doubles
  677. such as the two occurrences of `th' in `with the'.
  678.  
  679.    Another possible regexp searches for word-constituent characters
  680. followed by non-word-constituent characters, reduplicated.  Here,
  681. `\\w+' matches one or more word-constituent characters and `\\W*'
  682. matches zero or more non-word-constituent characters.
  683.  
  684.      \\(\\(\\w+\\)\\W*\\)\\1
  685.  
  686. Again, not useful.
  687.  
  688.    Here is the pattern that I use.  It is not perfect, but good enough.
  689. `\\b' matches the empty string, provided it is at the beginning or end
  690. of a word; `[^@ \n\t]+' matches one or more occurrences of any
  691. characters that are _not_ an @-sign, space, newline, or tab.
  692.  
  693.      \\b\\([^@ \n\t]+\\)[ \n\t]+\\1\\b
  694.  
  695.    One can write more complicated expressions, but I found that this
  696. expression is good enough, so I use it.
  697.  
  698.    Here is the `the-the' function, as I include it in my `.emacs' file,
  699. along with a handy global key binding:
  700.  
  701.      (defun the-the ()
  702.        "Search forward for for a duplicated word."
  703.        (interactive)
  704.        (message "Searching for for duplicated words ...")
  705.        (push-mark)
  706.        ;; This regexp is not perfect
  707.        ;; but is fairly good over all:
  708.        (if (re-search-forward
  709.             "\\b\\([^@ \n\t]+\\)[ \n\t]+\\1\\b" nil 'move)
  710.            (message "Found duplicated word.")
  711.          (message "End of buffer")))
  712.      
  713.      ;; Bind `the-the' to  C-c \
  714.      (global-set-key "\C-c\\" 'the-the)
  715.  
  716.  
  717.    Here is test text:
  718.  
  719.      one two two three four five
  720.      five six seven
  721.  
  722.    You can substitute the other regular expressions shown above in the
  723. function definition and try each of them on this list.
  724.  
  725. 
  726. File: emacs-lisp-intro.info,  Node: Kill Ring,  Next: Full Graph,  Prev: the-the,  Up: Top
  727.  
  728. Handling the Kill Ring
  729. **********************
  730.  
  731.    The kill ring is a list that is transformed into a ring by the
  732. workings of the `rotate-yank-pointer' function.  The `yank' and
  733. `yank-pop' commands use the `rotate-yank-pointer' function.  This
  734. appendix describes the `rotate-yank-pointer' function as well as both
  735. the `yank' and the `yank-pop' commands.
  736.  
  737. * Menu:
  738.  
  739. * rotate-yank-pointer::         Move a pointer along a list and around.
  740. * yank::                        Paste a copy of a clipped element.
  741. * yank-pop::                    Insert first element pointed to.
  742.  
  743. 
  744. File: emacs-lisp-intro.info,  Node: rotate-yank-pointer,  Next: yank,  Prev: Kill Ring,  Up: Kill Ring
  745.  
  746. The `rotate-yank-pointer' Function
  747. ==================================
  748.  
  749.    The `rotate-yank-pointer' function changes the element in the kill
  750. ring to which `kill-ring-yank-pointer' points.  For example, it can
  751. change  `kill-ring-yank-pointer' from pointing to the second element to
  752. point to the third element.
  753.  
  754.    Here is the code for `rotate-yank-pointer':
  755.  
  756.      (defun rotate-yank-pointer (arg)
  757.        "Rotate the yanking point in the kill ring."
  758.        (interactive "p")
  759.        (let ((length (length kill-ring)))
  760.          (if (zerop length)
  761.              ;; then-part
  762.              (error "Kill ring is empty")
  763.            ;; else-part
  764.            (setq kill-ring-yank-pointer
  765.                  (nthcdr (% (+ arg
  766.                                (- length
  767.                                   (length
  768.                                    kill-ring-yank-pointer)))
  769.                             length)
  770.                          kill-ring)))))
  771.  
  772. * Menu:
  773.  
  774. * Understanding rotate-yk-ptr::
  775. * rotate-yk-ptr body::          The body of `rotate-yank-pointer'.
  776.  
  777. 
  778. File: emacs-lisp-intro.info,  Node: Understanding rotate-yk-ptr,  Next: rotate-yk-ptr body,  Prev: rotate-yank-pointer,  Up: rotate-yank-pointer
  779.  
  780. `rotate-yank-pointer' in Outline
  781. --------------------------------
  782.  
  783.    The `rotate-yank-pointer' function looks complex, but as usual, it
  784. can be understood by taking it apart piece by piece.  First look at it
  785. in skeletal form:
  786.  
  787.      (defun rotate-yank-pointer (arg)
  788.        "Rotate the yanking point in the kill ring."
  789.        (interactive "p")
  790.        (let VARLIST
  791.          BODY...)
  792.  
  793.    This function takes one argument, called `arg'.  It has a brief
  794. documentation string; and it is interactive with a small `p', which
  795. means that the argument must be a processed prefix passed to the
  796. function as a number.
  797.  
  798.    The body of the function definition is a `let' expression, which
  799. itself has a body as well as a VARLIST.
  800.  
  801.    The `let' expression declares a variable that will be only usable
  802. within the bounds of this function.  This variable is called `length'
  803. and is bound to a value that is equal to the number of items in the
  804. kill ring.  This is done by using the function called `length'.  (Note
  805. that this function has the same name as the variable called `length';
  806. but one use of the word is to name the function and the other is to
  807. name the variable.  The two are quite distinct.  Similarly, an English
  808. speaker will distinguish between the meanings of the word `ship' when
  809. he says: "I must ship this package immediately." and "I must get aboard
  810. the ship immediately.")
  811.  
  812.    The function `length' tells the number of items there are in a list,
  813. so `(length kill-ring)' returns the number of items there are in the
  814. kill ring.
  815.  
  816. 
  817. File: emacs-lisp-intro.info,  Node: rotate-yk-ptr body,  Prev: Understanding rotate-yk-ptr,  Up: rotate-yank-pointer
  818.  
  819. The Body of `rotate-yank-pointer'
  820. ---------------------------------
  821.  
  822.    The body of `rotate-yank-pointer' is a `let' expression and the body
  823. of the `let' expression is an `if' expression.
  824.  
  825.    The purpose of the `if' expression is to find out whether there is
  826. anything in the kill ring.  If the kill ring is empty, the `error'
  827. function stops evaluation of the function and prints a message in the
  828. echo area.  On the other hand, if the kill ring has something in it, the
  829. work of the function is done.
  830.  
  831.    Here is the if-part and then-part of the `if' expression:
  832.  
  833.      (if (zerop length)                      ; if-part
  834.          (error "Kill ring is empty")        ; then-part
  835.        ...
  836.  
  837. If there is not anything in the kill ring, its length must be zero and
  838. an error message sent to the user: `Kill ring is empty'.  The `if'
  839. expression uses the function `zerop' which returns true if the value it
  840. is testing is zero.  When `zerop' tests true, the then-part of the `if'
  841. is evaluated.  The then-part is a list starting with the function
  842. `error', which is a function that is similar to the `message' function
  843. (*note message::), in that it prints a one-line message in the echo
  844. area.  However, in addition to printing a message, `error' also stops
  845. evaluation of the function within which it is embedded.  This means
  846. that the rest of the function will not be evaluated if the length of
  847. the kill ring is zero.
  848.  
  849. * Menu:
  850.  
  851. * Digression concerning error::  How to mislead humans, but not computers.
  852. * rotate-yk-ptr else-part::     The else-part of the `if' expression.
  853. * Remainder Function::          The remainder, `%', function.
  854. * rotate-yk-ptr remainder::     Using `%' in `rotate-yank-pointer'.
  855. * kill-rng-yk-ptr last elt::    Pointing to the last element.
  856.  
  857. 
  858. File: emacs-lisp-intro.info,  Node: Digression concerning error,  Next: rotate-yk-ptr else-part,  Prev: rotate-yk-ptr body,  Up: rotate-yk-ptr body
  859.  
  860. Digression about the word `error'
  861. .................................
  862.  
  863.    (In my opinion, it is slightly misleading, at least to humans, to use
  864. the term `error' as the name of the `error' function.  A better term
  865. would be `cancel'.  Strictly speaking, of course, you cannot point to,
  866. much less rotate a pointer to a list that has no length, so from the
  867. point of view of the computer, the word `error' is correct.  But a
  868. human expects to attempt this sort of thing, if only to find out
  869. whether the kill ring is full or empty.  This is an act of exploration.
  870.  
  871.    (From the human point of view, the act of exploration and discovery
  872. is not necessarily an error, and therefore should not be labelled as
  873. one, even in the bowels of a computer.  As it is, the code in Emacs
  874. implies that a human who is acting virtuously, by exploring his or her
  875. environment, is making an error.  This is bad.  Even though the computer
  876. takes the same steps as it does when there is an `error', a term such as
  877. `cancel' would have a clearer connotation.)
  878.  
  879. 
  880. File: emacs-lisp-intro.info,  Node: rotate-yk-ptr else-part,  Next: Remainder Function,  Prev: Digression concerning error,  Up: rotate-yk-ptr body
  881.  
  882. The else-part of the `if' expression
  883. ....................................
  884.  
  885.    The else-part of the `if' expression is dedicated to setting the
  886. value of `kill-ring-yank-pointer' when the kill ring has something in
  887. it.  The code looks like this:
  888.  
  889.      (setq kill-ring-yank-pointer
  890.            (nthcdr (% (+ arg
  891.                          (- length
  892.                             (length kill-ring-yank-pointer)))
  893.                       length)
  894.                    kill-ring)))))
  895.  
  896.    This needs some examination.  Clearly, `kill-ring-yank-pointer' is
  897. being set to be equal to some CDR of the kill ring, using the `nthcdr'
  898. function that is described in an earlier section.  (*Note
  899. copy-region-as-kill::.)  But exactly how does it do this?
  900.  
  901.    Before looking at the details of the code let's first consider the
  902. purpose of the `rotate-yank-pointer' function.
  903.  
  904.    The `rotate-yank-pointer' function changes what
  905. `kill-ring-yank-pointer' points to.  If `kill-ring-yank-pointer' starts
  906. by pointing to the first element of a list, a call to
  907. `rotate-yank-pointer' causes it to point to the second element; and if
  908. `kill-ring-yank-pointer' points to the second element, a call to
  909. `rotate-yank-pointer' causes it to point to the third element.  (And if
  910. `rotate-yank-pointer' is given an argument greater than 1, it jumps the
  911. pointer that many elements.)
  912.  
  913.    The `rotate-yank-pointer' function uses `setq' to reset what the
  914. `kill-ring-yank-pointer' points to.  If `kill-ring-yank-pointer' points
  915. to the first element of the kill ring, then, in the simplest case, the
  916. `rotate-yank-pointer' function must cause it to point to the second
  917. element.  Put another way, `kill-ring-yank-pointer' must be reset to
  918. have a value equal to the CDR of the kill ring.
  919.  
  920.    That is, under these circumstances,
  921.  
  922.      (setq kill-ring-yank-pointer
  923.         ("some text" "a different piece of text" "yet more text"))
  924.      
  925.      (setq kill-ring
  926.         ("some text" "a different piece of text" "yet more text"))
  927.  
  928. the code should do this:
  929.  
  930.      (setq kill-ring-yank-pointer (cdr kill-ring))
  931.  
  932. As a result, the `kill-ring-yank-pointer' will look like this:
  933.  
  934.      kill-ring-yank-pointer
  935.           => ("a different piece of text" "yet more text"))
  936.  
  937.    The actual `setq' expression uses the `nthcdr' function to do the
  938. job.
  939.  
  940.    As we have seen before (*note nthcdr::), the `nthcdr' function works
  941. by repeatedly taking the CDR of a list--it takes the CDR of the CDR of
  942. the CDR ...
  943.  
  944.    The two following expressions produce the same result:
  945.  
  946.      (setq kill-ring-yank-pointer (cdr kill-ring))
  947.      
  948.      (setq kill-ring-yank-pointer (nthcdr 1 kill-ring))
  949.  
  950.    In the `rotate-yank-pointer' function, however, the first argument
  951. to `nthcdr' is a rather complex looking expression with lots of
  952. arithmetic inside of it:
  953.  
  954.      (% (+ arg
  955.            (- length
  956.               (length kill-ring-yank-pointer)))
  957.         length)
  958.  
  959.    As usual, we need to look at the most deeply embedded expression
  960. first and then work our way towards the light.
  961.  
  962.    The most deeply embedded expression is `(length
  963. kill-ring-yank-pointer)'.  This finds the length of the current value of
  964. the `kill-ring-yank-pointer'.  (Remember that the
  965. `kill-ring-yank-pointer' is the name of a variable whose value is a
  966. list.)
  967.  
  968.    The measurement of the length is inside the expression:
  969.  
  970.      (- length (length kill-ring-yank-pointer))
  971.  
  972. In this expression, the first `length' is the variable that was
  973. assigned the length of the kill ring in the `let' statement at the
  974. beginning of the function.  (One might think this function would be
  975. clearer if the variable `length' were named `length-of-kill-ring'
  976. instead; but if you look at the text of the whole function, you will
  977. see that it is so short that naming this variable `length' is not a
  978. bother, unless you are pulling the function apart into very tiny pieces
  979. as we are doing here.)
  980.  
  981.    So the line `(- length (length kill-ring-yank-pointer))' tells the
  982. difference between the length of the kill ring and the length of the
  983. list whose name is `kill-ring-yank-pointer'.
  984.  
  985.    To see how all this fits into the `rotate-yank-pointer' function,
  986. let's begin by analyzing the case where `kill-ring-yank-pointer' points
  987. to the first element of the kill ring, just as `kill-ring' does, and
  988. see what happens when `rotate-yank-pointer' is called with an argument
  989. of 1.
  990.  
  991.    The variable `length' and the value of the expression `(length
  992. kill-ring-yank-pointer)' will be the same since the variable `length'
  993. is the length of the kill ring and the `kill-ring-yank-pointer' is
  994. pointing to the whole kill ring.  Consequently, the value of
  995.  
  996.      (- length (length kill-ring-yank-pointer))
  997.  
  998. will be zero.  Since the value of `arg' will be 1, this will mean that
  999. the value of the whole expression
  1000.  
  1001.      (+ arg (- length (length kill-ring-yank-pointer)))
  1002.  
  1003. will be 1.
  1004.  
  1005.    Consequently, the argument to `nthcdr' will be found as the result of
  1006. the expression
  1007.  
  1008.      (% 1 length)
  1009.  
  1010. 
  1011. File: emacs-lisp-intro.info,  Node: Remainder Function,  Next: rotate-yk-ptr remainder,  Prev: rotate-yk-ptr else-part,  Up: rotate-yk-ptr body
  1012.  
  1013. The `%' remainder function
  1014. ..........................
  1015.  
  1016.    To understand `(% 1 length)', we need to understand `%'.  According
  1017. to its documentation (which I just found by typing `C-h f % <RET>'),
  1018. the `%' function returns the remainder of its first argument divided by
  1019. its second argument.  For example, the remainder of 5 divided by 2 is
  1020. 1.  (2 goes into 5 twice with a remainder of 1.)
  1021.  
  1022.    What surprises people who don't often do arithmetic is that a smaller
  1023. number can be divided by a larger number and have a remainder.  In the
  1024. example we just used, 5 was divided by 2.  We can reverse that and ask,
  1025. what is the result of dividing 2 by 5?  If you can use fractions, the
  1026. answer is obviously 2/5 or .4; but if, as here, you can only use whole
  1027. numbers, the result has to be something different.  Clearly, 5 can go
  1028. into 2 zero times, but what of the remainder?  To see what the answer
  1029. is, consider a case that has to be familiar from childhood:
  1030.  
  1031.    * 5 divided by 5 is 1 with a remainder of 0;
  1032.  
  1033.    * 6 divided by 5 is 1 with a remainder of 1;
  1034.  
  1035.    * 7 divided by 5 is 1 with a remainder of 2.
  1036.  
  1037.    * Similarly, 10 divided by 5 is 2 with a remainder of 0;
  1038.  
  1039.    * 11 divided by 5 is 2 with a remainder of 1;
  1040.  
  1041.    * 12 divided by 5 is 1 with a remainder of 2.
  1042.  
  1043. By considering the cases as parallel, we can see that
  1044.  
  1045.    * zero divided by 5 must be zero with a remainder of zero;
  1046.  
  1047.    * 1 divided by 5 must be zero with a remainder of 1;
  1048.  
  1049.    * 2 divided by 5 must be zero with a remainder of 2;
  1050.  
  1051. and so on.
  1052.  
  1053.    So, in this code, if the value of `length' is 5, then the result of
  1054. evaluating
  1055.  
  1056.      (% 1 5)
  1057.  
  1058. is 1.  (I just checked this by placing the cursor after the expression
  1059. and typing `C-x C-e'.  Indeed, 1 is printed in the echo area.)
  1060.  
  1061. 
  1062. File: emacs-lisp-intro.info,  Node: rotate-yk-ptr remainder,  Next: kill-rng-yk-ptr last elt,  Prev: Remainder Function,  Up: rotate-yk-ptr body
  1063.  
  1064. Using `%' in `rotate-yank-pointer'
  1065. ..................................
  1066.  
  1067.    When the `kill-ring-yank-pointer' points to the beginning of the
  1068. kill ring, and the argument passed to `rotate-yank-pointer' is 1, the
  1069. `%' expression returns 1:
  1070.  
  1071.      (- length (length kill-ring-yank-pointer))
  1072.           => 0
  1073.  
  1074. therefore,
  1075.  
  1076.      (+ arg (- length (length kill-ring-yank-pointer)))
  1077.           => 1
  1078.  
  1079. and consequently:
  1080.  
  1081.      (% (+ arg (- length (length kill-ring-yank-pointer)))
  1082.         length)
  1083.           => 1
  1084.  
  1085. regardless of the value of `length'.
  1086.  
  1087. As a result of this, the `setq kill-ring-yank-pointer' expression
  1088. simplifies to:
  1089.  
  1090.      (setq kill-ring-yank-pointer (nthcdr 1 kill-ring))
  1091.  
  1092. What it does is now easy to understand.  Instead of pointing as it did
  1093. to the first element of the kill ring, the `kill-ring-yank-pointer' is
  1094. set to point to the second element.
  1095.  
  1096.    Clearly, if the argument passed to `rotate-yank-pointer' is two, then
  1097. the `kill-ring-yank-pointer' is set to `(nthcdr 2 kill-ring)'; and so
  1098. on for different values of the argument.
  1099.  
  1100.    Similarly, if the `kill-ring-yank-pointer' starts out pointing to
  1101. the second element of the kill ring, its length is shorter than the
  1102. length of the kill ring by 1, so the computation of the remainder is
  1103. based on the expression `(% (+ arg 1) length)'.  This means that the
  1104. `kill-ring-yank-pointer' is moved from the second element of the kill
  1105. ring to the third element if the argument passed to
  1106. `rotate-yank-pointer' is 1.
  1107.  
  1108. 
  1109. File: emacs-lisp-intro.info,  Node: kill-rng-yk-ptr last elt,  Prev: rotate-yk-ptr remainder,  Up: rotate-yk-ptr body
  1110.  
  1111. Pointing to the last element
  1112. ............................
  1113.  
  1114.    The final question is, what happens if the `kill-ring-yank-pointer'
  1115. is set to the _last_ element of the kill ring?  Will a call to
  1116. `rotate-yank-pointer' mean that nothing more can be taken from the kill
  1117. ring?  The answer is no.  What happens is different and useful.  The
  1118. `kill-ring-yank-pointer' is set to point to the beginning of the kill
  1119. ring instead.
  1120.  
  1121.    Let's see how this works by looking at the code, assuming the length
  1122. of the kill ring is 5 and the argument passed to `rotate-yank-pointer'
  1123. is 1.  When the `kill-ring-yank-pointer' points to the last element of
  1124. the kill ring, its length is 1.  The code looks like this:
  1125.  
  1126.      (% (+ arg (- length (length kill-ring-yank-pointer))) length)
  1127.  
  1128.    When the variables are replaced by their numeric values, the
  1129. expression looks like this:
  1130.  
  1131.      (% (+ 1 (- 5 1)) 5)
  1132.  
  1133. This expression can be evaluated by looking at the most embedded inner
  1134. expression first and working outwards:  The value of `(- 5 1)' is 4;
  1135. the sum of `(+ 1 4)' is 5; and the remainder of dividing 5 by 5 is
  1136. zero.  So what `rotate-yank-pointer' will do is
  1137.  
  1138.      (setq kill-ring-yank-pointer (nthcdr 0 kill-ring))
  1139.  
  1140. which will set the `kill-ring-yank-pointer' to point to the beginning
  1141. of the kill ring.
  1142.  
  1143.    So what happens with successive calls to `rotate-yank-pointer' is
  1144. that it moves the `kill-ring-yank-pointer' from element to element in
  1145. the kill ring until it reaches the end; then it jumps back to the
  1146. beginning.  And this is why the kill ring is called a ring, since by
  1147. jumping back to the beginning, it is as if the list has no end!  (And
  1148. what is a ring, but an entity with no end?)
  1149.  
  1150. 
  1151. File: emacs-lisp-intro.info,  Node: yank,  Next: yank-pop,  Prev: rotate-yank-pointer,  Up: Kill Ring
  1152.  
  1153. `yank'
  1154. ======
  1155.  
  1156.    After learning about `rotate-yank-pointer', the code for the `yank'
  1157. function is almost easy.  It has only one tricky part, which is the
  1158. computation of the argument to be passed to `rotate-yank-pointer'.
  1159.  
  1160.    The code looks like this:
  1161.  
  1162.      (defun yank (&optional arg)
  1163.        "Reinsert the last stretch of killed text.
  1164.      More precisely, reinsert the stretch of killed text most
  1165.      recently killed OR yanked.
  1166.      With just C-U as argument, same but put point in front
  1167.      (and mark at end).  With argument n, reinsert the nth
  1168.      most recently killed stretch of killed text.
  1169.      See also the command \\[yank-pop]."
  1170.      
  1171.        (interactive "*P")
  1172.        (rotate-yank-pointer (if (listp arg) 0
  1173.                               (if (eq arg '-) -1
  1174.                                 (1- arg))))
  1175.        (push-mark (point))
  1176.        (insert (car kill-ring-yank-pointer))
  1177.        (if (consp arg)
  1178.            (exchange-point-and-mark)))
  1179.  
  1180.    Glancing over this code, we can understand the last few lines readily
  1181. enough.  The mark is pushed, that is, remembered; then the first element
  1182. (the CAR) of what the `kill-ring-yank-pointer' points to is inserted;
  1183. and then, if the argument passed the function is a `cons', point and
  1184. mark are exchanged so the point is put in the front of the inserted
  1185. text rather than at the end.  This option is explained in the
  1186. documentation.  The function itself is interactive with `"*P"'.  This
  1187. means it will not work on a read-only buffer, and that the unprocessed
  1188. prefix argument is passed to the function.
  1189.  
  1190. * Menu:
  1191.  
  1192. * rotate-yk-ptr arg::           Pass the argument to `rotate-yank-pointer'.
  1193. * rotate-yk-ptr negative arg::  Pass a negative argument.
  1194.  
  1195. 
  1196. File: emacs-lisp-intro.info,  Node: rotate-yk-ptr arg,  Next: rotate-yk-ptr negative arg,  Prev: yank,  Up: yank
  1197.  
  1198. Passing the argument
  1199. ....................
  1200.  
  1201.    The hard part of `yank' is understanding the computation that
  1202. determines the value of the argument passed to `rotate-yank-pointer'.
  1203. Fortunately, it is not so difficult as it looks at first sight.
  1204.  
  1205.    What happens is that the result of evaluating one or both of the
  1206. `if' expressions will be a number and that number will be the argument
  1207. passed to `rotate-yank-pointer'.
  1208.  
  1209.    Laid out with comments, the code looks like this:
  1210.  
  1211.      (if (listp arg)                         ; if-part
  1212.          0                                   ; then-part
  1213.        (if (eq arg '-)                       ; else-part, inner if
  1214.            -1                                ; inner if's then-part
  1215.          (1- arg))))                         ; inner if's else-part
  1216.  
  1217. This code consists of two `if' expression, one the else-part of the
  1218. other.
  1219.  
  1220.    The first or outer `if' expression tests whether the argument passed
  1221. to `yank' is a list.  Oddly enough, this will be true if `yank' is
  1222. called without an argument--because then it will be passed the value of
  1223. `nil' for the optional argument and an evaluation of `(listp nil)'
  1224. returns true!  So, if no argument is passed to `yank', the argument
  1225. passed to `rotate-yank-pointer' inside of `yank' is zero.  This means
  1226. the pointer is not moved and the first element to which
  1227. `kill-ring-yank-pointer' points is inserted, as we expect.  Similarly,
  1228. if the argument for `yank' is `C-u', this will be read as a list, so
  1229. again, a zero will be passed to `rotate-yank-pointer'.  (`C-u' produces
  1230. an unprocessed prefix argument of `(4)', which is a list of one
  1231. element.)  At the same time, later in the function, this argument will
  1232. be read as a `cons' so point will be put in the front and mark at the
  1233. end of the insertion.  (The `P' argument to `interactive' is designed
  1234. to provide these values for the case when an optional argument is not
  1235. provided or when it is `C-u'.)
  1236.  
  1237.    The then-part of the outer `if' expression handles the case when
  1238. there is no argument or when it is `C-u'.  The else-part handles the
  1239. other situations.  The else-part is itself another `if' expression.
  1240.  
  1241.    The inner `if' expression tests whether the argument is a minus
  1242. sign.  (This is done by pressing the <META> and `-' keys at the same
  1243. time, or the <ESC> key and then the `-' key).  In this case, the
  1244. `rotate-yank-pointer' function is passed `-1' as an argument.  This
  1245. moves the `kill-ring-yank-pointer' backwards, which is what is desired.
  1246.  
  1247.    If the true-or-false-test of the inner `if' expression is false
  1248. (that is, if the argument is not a minus sign), the else-part of the
  1249. expression is evaluated.  This is the expression `(1- arg)'.  Because
  1250. of the two `if' expressions, it will only occur when the argument is a
  1251. positive number or when it is a negative number (not just a minus sign
  1252. on its own).  What `(1- arg)' does is decrement the number and return
  1253. it.  (The `1-' function subtracts one from its argument.)  This means
  1254. that if the argument to `rotate-yank-pointer' is 1, it is reduced to
  1255. zero, which means the first element to which `kill-ring-yank-pointer'
  1256. points is yanked back, as you would expect.
  1257.  
  1258.